/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package compra;

import java.sql.Date;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.ErroAcessoRepositorioException;
import util.HibernateUtil;

/**
 *
 * @author Alberto
 */
public class RepositorioCompra {
    /**
     * Mensagem que indica erro de acesso ao banco de dados.
     */
    private static final String MSG_ERRO_ACESSO_BD = "Erro de acesso ao banco de dados";
    
    public RepositorioCompra(){ }
    
    /**
     * Método que ira cadastrar a Compra na base
     * 
     * @param objCompra
     * @throws ErroAcessoRepositorioException 
     */
    public void cadastrarAtualizar(Compra objCompra) throws ErroAcessoRepositorioException {
        
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            
            s.saveOrUpdate(objCompra);
            
            t.commit();
            
        } catch (Exception e) {
            t.rollback();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }
    }
    
    /**
     * Método que ira procurar uma determinada Compra na base
     * @param idCompra
     * @return Compra
     * @throws ErroAcessoRepositorioException 
     */
    public Compra procurar(int idCompra) throws ErroAcessoRepositorioException {
        Compra objCompra = null;
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            
            objCompra = (Compra) s.get(Compra.class, idCompra);
            
            t.commit();
            
            if(objCompra == null) throw new Exception("Compra não cadastrada");
            
        } catch (Exception e) {
            t.rollback();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }
        return objCompra;
    }
    
    /**
     * Método que ira verificar a existencia de uma Compra na base
     * 
     * @param idCompra
     * @return boolean
     * @throws ErroAcessoRepositorioException 
     */
    public boolean existe(int idCompra) throws ErroAcessoRepositorioException{
        Compra objCompra = null;
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            
            objCompra = (Compra) s.get(Compra.class, idCompra);
            
            t.commit();
            
        } catch (Exception e) {
            t.rollback();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }
        return (objCompra != null);
    }
    
    /**
     * Método que ira listar as Compra da base
     * 
     * @param strComplemento
     * @return List<Compra> 
     * @throws ErroAcessoRepositorioException 
     */
    public List<Compra> listar(String strComplemento) throws ErroAcessoRepositorioException {
        List<Compra> listCompra = null;
        Session s = null;
        Transaction t = null;

        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            Query q = s.createQuery("from Compra WHERE id_Compra IS NOT NULL " + strComplemento);
            listCompra = q.list();
            t.commit();
        } catch (Exception e) {
            t.rollback();
            System.out.println(e.getMessage());
            throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD, null, 1);
        }
        return listCompra;
    }
    
    /**
     * Método que ira listar as Compra da base
     * 
     * @param strComplemento
     * @return List<Compra> 
     * @throws ErroAcessoRepositorioException 
     */
    public List<Compra> listarAtivas() throws ErroAcessoRepositorioException {
        String complemento = " AND status_compra = TRUE ORDER by id_compra, data_compra";
        
        return this.listar(complemento);
    }
    
    /**
     * Método que ira listar as Compra da base
     * 
     * @param strComplemento
     * @return List<Compra> 
     * @throws ErroAcessoRepositorioException 
     */
    public List<Compra> listarAtivasENaoRecebidas() throws ErroAcessoRepositorioException {
        String complemento = " AND status_compra = TRUE AND flag_recebido = FALSE ORDER by id_compra, data_compra";
        
        return this.listar(complemento);
    }
    
    public List<Compra> listarCompraPorFornecedorPorSolicitacaoPorFuncionarioPorData(int idFornecedor, int idSolicitacaoCompra, int idFuncionario, Date dataSolicitacaoInicial, Date dataSolicitacaoFinal)  throws ErroAcessoRepositorioException {
        List<Compra> listCompra = null;
        Session s = null;
        Transaction t = null;
        
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            String sql = "from Compra WHERE status_compra = true ";
            
            if(idFornecedor > 0)
                sql += " AND id_fornecedor = :id_fornecedor";
            
            if(idSolicitacaoCompra > 0)
                sql += " AND id_solicitacao_compra = :id_solicitacao_compra";
            
            if(idFuncionario > 0)
                sql += " AND id_funcionario = :id_funcionario";
            
            if(dataSolicitacaoInicial.toString().trim().length() > 0 && dataSolicitacaoFinal.toString().trim().length() > 0)
                sql += " AND data_compra between :data_compra_inicial AND :data_compra_final ";
            
            
            Query q = s.createQuery(sql + " ORDER by id_compra, data_compra");
            
            if(idFornecedor > 0)
                q.setParameter("id_fornecedor", idFornecedor);
            
            if(idSolicitacaoCompra > 0)
                q.setParameter("id_solicitacao_compra", idSolicitacaoCompra); 
            
            if(idFuncionario > 0)
                q.setParameter("id_funcionario", idFuncionario);
            
            if(dataSolicitacaoInicial.toString().trim().length() > 0)
                q.setParameter("data_compra_inicial", dataSolicitacaoInicial);
            
            if(dataSolicitacaoFinal.toString().trim().length() > 0)
                q.setParameter("data_compra_final", dataSolicitacaoFinal);
            
            listCompra = q.list();
            t.commit();
        } catch (Exception e) {
            t.rollback();
            System.out.println(e.getMessage());
            throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD, null, 1);
        }
        return listCompra;
    }
    
    /**
     * Método que ira remover as Compras da base
     * 
     * @param idCompra
     * @throws Exception 
     */
    public void remover(int idCompra) throws Exception {
        Compra objCompra = null;
        if(this.existe(idCompra)){
            try{
                // procurando a Compra
                objCompra = (Compra) this.procurar(idCompra);
                
                // setando o seu status pra false
                objCompra.setStatusCompra(false);
                
                // atualizando a Compra na base
                this.cadastrarAtualizar(objCompra);
            }catch(Exception e){
                throw e;
            }
        }else
            throw new Exception("Compra Não Cadastrada");
    
    }
}
